package com.gomoku.botrunning.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Random;
import java.util.Scanner;

public class Bot3 implements java.util.function.Supplier<JSONObject> { //青铜
    private static final int BOARD_SIZE = 16;

    private JSONObject findDefendMove(int[][] map) {
        // 检测四个方向：水平、垂直、左上-右下、右上-左下
        int[][] directions = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};

        for (int r = 1; r < BOARD_SIZE; r++) {
            for (int c = 1; c < BOARD_SIZE; c++) {
                // 跳过非空位（仅检查空位是否能拦截对手）
                if (map[r][c] != 0) continue;

                // 遍历四个方向，检查该空位是否能拦截对手的连续3子
                for (int[] dir : directions) {
                    int dr = dir[0];
                    int dc = dir[1];

                    // 统计该方向上对手的连续棋子数
                    int opponentCount = 0;
                    // 检查“当前空位+方向”的两侧（避免漏判“活三”）
                    for (int step = -3; step <= 3; step++) {
                        // 计算当前检查的坐标
                        int nr = r + step * dr;
                        int nc = c + step * dc;

                        // 跳过棋盘外的坐标
                        if (nr < 0 || nr >= BOARD_SIZE || nc < 0 || nc >= BOARD_SIZE) continue;

                        // 遇到对手棋子，计数+1；遇到自身棋子/空位，中断计数
                        if (map[nr][nc] == 1) {
                            opponentCount++;
                        } else if (map[nr][nc] == 2 || (nr == r && nc == c)) {
                            // 自身棋子或当前空位，不中断（空位是潜在拦截点）
                            continue;
                        } else {
                            break;
                        }
                    }
                    // 若对手有连续3子，当前空位是防守点，直接返回
                    if (opponentCount >= 3) {
                        JSONObject defendMove = new JSONObject();
                        defendMove.put("r", r);
                        defendMove.put("c", c);
                        return defendMove;
                    }
                }
            }
        }
        // 无防守需求，返回null
        return null;
    }
    public JSONObject nextMove(String input) {
        //input 传入的是一个二维数组标记这黑白棋子的位置
        int[][] map = JSON.parseObject(input,int[][].class);
        //默认 1表示黑棋，2表示白棋 最后返回
        JSONObject defendMove = findDefendMove(map);
        if (defendMove == null) {
            // 如果没有防守位置，创建新的JSONObject
            defendMove = new JSONObject();
            Random random = new Random();
            // 生成1-15之间的随机数（包括1和15）
            int row = random.nextInt(15) + 1;
            int col = random.nextInt(15) + 1;
            while(true) {
                if (map[row][col] != 0) {
                    row = random.nextInt(15) + 1;
                    col = random.nextInt(15) + 1;
                } else
                    break;
            }
            defendMove.put("r",row);
            defendMove.put("c",col);
        }
        return defendMove;
    }

    @Override
    public JSONObject get(){
        File file = new File("input.txt");
        try {
            Scanner sc = new Scanner(file);
            return nextMove(sc.next()); //又封装了一层，从这个文件中得到input
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}